package services

import (
	"context"
	"fmt"
	"log"
	"os"
	"os/exec"
	"pass-tree/internal/logic/models"
	"pass-tree/internal/logic/repositories"
	"time"

	"fyne.io/fyne/v2"
	"github.com/chromedp/chromedp"
	"github.com/yanyiwu/gojieba"
)

type Application struct {
	Win         fyne.Window
	TreeTabData map[string]TreeTabInfo
}

// 左侧树形结构选项卡的信息
type TreeTabInfo struct {
	Info models.Category
	View func(w fyne.Window) fyne.CanvasObject
}

// 获取分类列表数据
func (app *Application) GetCategoryList() ([]models.Category, []string) {
	list, err := repositories.GetCategory()
	if err != nil {
		fyne.LogError("获取分类列表数据失败", err)
	}
	listArray := make([]string, 0)
	for _, v := range list {
		listArray = append(listArray, v.Name)
	}
	return list, listArray
}

// 获取分类列表数据
func (app *Application) GetCategory() ([]models.Category, error) {
	list, err := repositories.GetCategory()
	if err != nil {
		fyne.LogError("获取分类列表数据失败", err)
	}
	return list, err
}

// 保存分类数据
func (app *Application) SaveCategory(category *models.Category) error {
	var err error
	if err = repositories.SaveCategory(category); err != nil {
		fmt.Println("保存分类失败", err)
	}
	return err
}

// 更新分类数据
func (app *Application) UpdateCategory(category *models.Category) error {
	var err error
	if err = repositories.UpdateCategory(category); err != nil {
		fmt.Println("修改分类失败", err)
	}
	return err
}

// 删除分类数据
func (app *Application) DeleteCategory(id int) error {
	err := repositories.DeleteCategory(id)
	if err != nil {
		fyne.LogError("删除分类失败", err)
	}
	return err
}

func (app *Application) GetTableData(categoryId int) []models.Password {
	/* data := [][]string{
		{"名称", "用户名", "密码", "状态"}, //表头
		{"微信小程序", "0", "审核失败", "0"},
		{"审核中", "0", "审核通过", "0"},
		{"审核通过(备案中)", "0", "升级中", "0"},
		{"已下架", "0", "其他", "0"},
		{"全部", "0", "", ""},
	} */
	result, err := repositories.GetPasswordData(categoryId)
	if err != nil {
		fyne.LogError("获取密码失败", err)
		return nil
	}
	return result
}

// 保存密码数据
func (app *Application) SavePassword(pass *models.Password) {
	err := repositories.SavePassword(pass)
	if err != nil {
		fyne.LogError("保存密码失败", err)
	}
}

// 开始分词
func (app *Application) StartParticiple(text string) {

	/* text := `@蛟 菏泽祥盛人力资源有限公司      tt13d6656b8ce732f101  账号：13258025511
	密码：zhang001
	id:621
	管理账号
	账号：xiangshengrenli 密码：xiangsheng2024
	转化账号：
	账号：xs_shiyanliang 密码：xiangsheng2024
	已经备案 订单已上传 需要发版` */

	/* text := `公司全称：重庆优快人力资源管理公司
	公司地址：重庆市万州区高峰街道楼子中路1号4号楼
	账号：19132895814
	密码：huijie001
	负责人及电话：向帆 15123562109  19132895814
	转化人员姓名电话(可以多个)：王秋菊 15123519383；13330307765
	开发人（谁签的）：代运营客户` */

	// 初始化分词器
	x := gojieba.NewJieba()
	defer x.Free()

	x.AddWord("人力资源管理公司")
	x.AddWord("人力资源管理有限公司")
	x.AddWord("有限责任公司")
	x.AddWord("人力资源服务有限公司")
	x.AddWord("人力资源集团有限公司")
	x.AddWord("外包有限公司")
	x.AddWord("管理有限公司")
	x.AddWord("有限公司")

	// 使用HMM模型进行分词
	words := x.Cut(text, true)
	for _, word := range words {
		if word != " " {
			fmt.Println(word)
		}
	}

}

// 删除密码数据
func (app *Application) DeletePassword(id int) {
	err := repositories.DeletePassword(id)
	if err != nil {
		fyne.LogError("保存密码失败", err)
	}
}

// 搜索密码数据列表
func (app *Application) SearchPasswordData(keyword string) []models.Password {
	list, err := repositories.SearchPasswordData(keyword)
	if err != nil {
		fyne.LogError("搜索数据失败", err)
	}
	return list
}

// 格式化详情
func (app *Application) FormatDetails(info models.Password) string {
	content := "名  称:  " + info.Name + "\n\n" + "用户名:  " + info.Username + "\n\n" + "密  码:  " + info.Password + "\n\n" + "描  述:  " + info.Desc
	if info.CustomContent != nil {
		for _, v := range info.CustomContent {
			content += "\n\n" + v.Input_type + ":  " + v.Content
		}
	}
	return content
}

// 导入到抖服版本精灵
func (app *Application) ImportToDoufu(name, appid string) {

	// 抖音服务商工具路径,指定要打开的.exe文件的路径,// 设置工作目录
	var tatPath = [2]string{"D:/raymond/tiktok-audit-tool/", "tiktok-audit-tool.exe"}
	// var tatPath = [2]string{"D:/project/go/src/tiktok-audit-tool/", "tiktok-audit-tool.exe"}
	// 创建命令对象
	cmd := exec.Command(tatPath[0]+tatPath[1], name, appid)
	// 设置工作目录
	cmd.Dir = tatPath[0]
	// 执行命令
	err := cmd.Run()
	if err != nil {
		fmt.Println("无法打开指定的.exe文件:", err)
		os.Exit(1)
	}
}

// 通过rpa自动从网页中获取信息
func (app *Application) RpaAutoWebObtainInfo(username, password string) {
	// 创建Chrome实例
	ctx, cancel := chromedp.NewContext(context.Background())
	defer cancel()

	// 设置超时
	ctx, cancel = context.WithTimeout(ctx, 80*time.Second)
	defer cancel()

	// 执行浏览器操作
	var buf []byte
	err := chromedp.Run(ctx,
		// 抖音开放平台登录页面
		chromedp.Navigate("https://developer.open-douyin.com/"),
		// chromedp.Navigate("https://developer.open-douyin.com/login?service=https%3A%2F%2Fdeveloper.open-douyin.com%2Fconsole"),
		chromedp.WaitVisible("body", chromedp.ByQuery), // 等待页面加载完成
		/* chromedp.SendKeys(`#mobile`, "myusername"),
		chromedp.SendKeys(`#password`, "mypassword"),
		chromedp.Click(`.semi-dy-open-typography-link-text`, chromedp.ByID), */
		// chromedp.Click(`.semi-dy-open-button .semi-dy-open-button-primary .semi-dy-open-button-size-large .semi-dy-open-button-block`, chromedp.ByID),
		chromedp.FullScreenshot(&buf, 90), // 截图
	)
	if err := os.WriteFile("screenshot.png", buf, 0644); err != nil {
		log.Fatal(err)
	}
	if err != nil {
		log.Fatalf("Failed to run ChromeDP: %v", err)
	}

}
